﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Telerik.Web.UI;
using System.Collections;
using Proxy;
using System.Web.Services;
using System.Text;
using SIM.Util;

namespace SIM.Geo.UI.Geo
{
    public partial class frmAvancePerforacionRegitro : PageBase
    {
        List<AvanceDiarioSondajeResponse> listaAvanceDiarioSondajes = new List<AvanceDiarioSondajeResponse>();
        List<DetallePerforacionResponse> listaDetallePerforacion = new List<DetallePerforacionResponse>();
        List<listarAvanceDiarioDistribucionTrabajo_Result> listaDistribucionTrabajo = new List<listarAvanceDiarioDistribucionTrabajo_Result>();

        #region SESSIONES
        private const string SESSION_PERFORACION = "Perforacion";
        private const string SESSION_PERFORACION_DETALLE = "DetallePerforacion";
        private const string SESSION_PRODUCTOS_CORONA = "ProductoCorona";
        private const string SESSION_PRODUCTOS_CONSUMO = "ProductoConsumo";
        private const string SESSION_PRODUCTOS_ESCARIADOR = "ProductoEscariador";
        private const string SESSION_CONSUMO = "Consumo";
        private const string SESSION_ENTUBACION = "Entubacion";
        private const string SESSION_PRODUCTOS_ENTUBACION = "ProductoEntubacion";
        private const string SESSION_DISTRIBUCION_TRABAJO = "DistribucionTrabajo";
        #endregion

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                string id = Request.Params["id"].ToString();
                string accion = Request.Params["acc"].ToString();
                string anio = Request.Params["an"].ToString();
                string mes = Request.Params["mes"].ToString();
 
                this.hidCodigo.Value = id;
                this.hidAccion.Value = accion;
                this.hidAnio.Value = anio;
                this.hidMes.Value = mes;
                LimpiarDetalles();

                CargarCombos();

                #region CargarDetalle
                if (accion.CompareTo(enmAccionRealizar.Nuevo.GetHashCode().ToString()) == 0)
                {
                    MostrarDetalle(int.Parse(id), enmAccionRealizar.Nuevo);
                }
                else if (accion.CompareTo(enmAccionRealizar.Edicion.GetHashCode().ToString()) == 0)
                {
                    MostrarDetalle(int.Parse(id), enmAccionRealizar.Edicion);
                }
                else if (accion.CompareTo(enmAccionRealizar.Edicion.GetHashCode().ToString()) == 0)
                {
                    MostrarDetalle(int.Parse(id), enmAccionRealizar.Ver);
                }
                #endregion

                this.txtCodigo.Enabled = false;
                CargarProductos();
                CargarTipoProducto();

                this.ListarSondajes();
                this.ListarConsumo();
                this.ListarEntubacion();

                this.txtEntrada.Attributes.Add("onblur", "return calcularHorasOperacion();");
                this.txtSalida.Attributes.Add("onblur", "return calcularHorasOperacion();");
            }

            if (this.hidCodigoSondaje.Value.CompareTo(this.hidDato.Value) != 0)
            {
                if (this.hidDato.Value.CompareTo("0") != 0)
                {
                    this.hidCodigoSondaje.Value = this.hidDato.Value;
                    CargarSondaje();
                }
            }
        }

        #region Metodos

        private void LimpiarDetalles()
        {
            Session[SESSION_PERFORACION] = null;
            Session[SESSION_PERFORACION_DETALLE] = null;
            Session[SESSION_PRODUCTOS_CORONA] = null;
            Session[SESSION_PRODUCTOS_CONSUMO] = null;
            Session[SESSION_PRODUCTOS_ESCARIADOR] = null;
            Session[SESSION_CONSUMO] = null;
            Session[SESSION_PRODUCTOS_ENTUBACION] = null;
            Session[SESSION_DISTRIBUCION_TRABAJO] = null;
        }

        private void CargarTipoProducto()
        {
            try
            {
                using (var proxy = new SEProductosPerforacionClient("BasicHttpBinding_ISEProductosPerforacion"))
                {
                    var lista = proxy.ObtenerListItem1(int.Parse(System.Configuration.ConfigurationManager.AppSettings["codigoTipoProductoEntubacion"]));
                    Session[SESSION_PRODUCTOS_ENTUBACION] = lista.ToList();
                }
            }
            catch (Exception ex)
            {

                Logger.Error("frmAvancePerforacionRegitro:CargarTipoProducto", ex);
            }
        }

        private void CargarProductos()
        {
            try
            {
                Session[SESSION_PRODUCTOS_CORONA] = null;
                Session[SESSION_PRODUCTOS_ESCARIADOR] = null;
                Session[SESSION_PRODUCTOS_CONSUMO] = null;

                int codigoTipoProductoCorona = int.Parse(System.Configuration.ConfigurationManager.AppSettings["codigoTipoProductoCorona"]);
                int codigoTipoProductoEscariador = int.Parse(System.Configuration.ConfigurationManager.AppSettings["codigoTipoProductoEscariador"]);
                int codigoTipoProductoConsumo = int.Parse(System.Configuration.ConfigurationManager.AppSettings["codigoTipoProductoConsumo"]);

                using (var proxy = new SEProductosPerforacionClient("BasicHttpBinding_ISEProductosPerforacion"))
                {
                    var listaProductoCorona = proxy.ObtenerListItem1(codigoTipoProductoCorona).ToList();
                    var listaProductoEscariador = proxy.ObtenerListItem1(codigoTipoProductoEscariador).ToList();
                    var listaProductoConsumo = proxy.ObtenerListItem2(codigoTipoProductoConsumo).ToList();

                    Session[SESSION_PRODUCTOS_CORONA] = listaProductoCorona;
                    Session[SESSION_PRODUCTOS_ESCARIADOR] = listaProductoEscariador;
                    Session[SESSION_PRODUCTOS_CONSUMO] = listaProductoConsumo;
                }

            }
            catch (Exception ex)
            {

                Logger.Error("frmAvancePerforacionRegitro:CargarProductos", ex);
            }
        }

        private void BuscarDetallePerforacion(int codigoSondaje)
        {
            try
            {
                //using (var proxy = new SEDetallePerforacionClient("BasicHttpBinding_ISEDetallePerforacion"))
                //{
                //    this.rgPerforacion.DataSource = proxy.BuscarDetallePerforacion(int.Parse(this.hidCodigo.Value), codigoSondaje);
                //    this.rgPerforacion.DataBind();
                //}

                var lista = (List<AvanceDiarioSondajeResponse>)Session[SESSION_PERFORACION];
                var item = lista.Where(x => x.CodigoSondaje == codigoSondaje).FirstOrDefault();
                if (item != null)
                {
                    this.rgPerforacion.DataSource = item.Detalles.ToList();
                    this.rgPerforacion.DataBind();
                    Session[SESSION_PERFORACION_DETALLE] = item.Detalles.ToList();
                }
                else
                {
                    this.listaDetallePerforacion.Clear();
                    this.rgPerforacion.DataSource = this.listaDetallePerforacion;
                    this.rgPerforacion.DataBind();
                    Session[SESSION_PERFORACION_DETALLE] = this.listaDetallePerforacion;
                }
            }
            catch (Exception ex)
            {

                Logger.Error("frmAvancePerforacionRegitro:BuscarDetallePerforacion", ex);
            }
        }

        private void CargarSondaje()
        {
            try
            {
                using (SESondajeClient proxy = new SESondajeClient("BasicHttpBinding_ISESondaje"))
                {
                    this.txtNombreDDH.Enabled = false;
                    var sondaje = proxy.ObtenerSondaje(int.Parse(this.hidCodigoSondaje.Value));
                    if (sondaje != null)
                    {
                        this.txtNombreDDH.Text = sondaje.NombreDDH;
                        this.txtInclinacion.Text = sondaje.Inclinacion.ToString();
                        this.txtSeccion.Text = sondaje.Seccion.ToString();
                        if (sondaje.Zona != null)
                            this.txtZona.Text = sondaje.Zona.Descripcion;

                        this.txtLabor.Text = string.Empty;
                        if (sondaje.Labor != null)
                            this.txtLabor.Text = sondaje.Labor.NombreLabor;
                        this.txtAzimut.Text = sondaje.Azimut.ToString();
                    }
                }
            }
            catch (Exception ex)
            {

                Logger.Error("frmAvancePerforacionRegitro:CargarSondaje", ex);
            }
        }

        private void CargarCombos()
        {
            try
            {
                using (SETrabajadorClient proxy = new SETrabajadorClient("BasicHttpBinding_ISETrabajador"))
                {
                    this.Bind(this.ddlPerforista, proxy.ObtenerListItem1(int.Parse(System.Configuration.ConfigurationManager.AppSettings["codigoPerfilTrabajadorPerforista"].ToString())));
                    this.ddlPerforista.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.SELECCIONE, TipoDropDownList.Seleccionar.GetHashCode().ToString()));

                    this.Bind(this.ddlAyudante, proxy.ObtenerListItem1(int.Parse(System.Configuration.ConfigurationManager.AppSettings["codigoPerfilTrabajadorAyudante"].ToString())));
                    this.ddlAyudante.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.NINGUNA, TipoDropDownList.Ninguno.GetHashCode().ToString()));
                }

                using (SEGeologoClient proxy = new SEGeologoClient("BasicHttpBinding_ISEGeologo"))
                {
                    this.Bind(this.ddlGeologo, proxy.ObtenerListItem().ToList());
                    this.ddlGeologo.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.SELECCIONE, TipoDropDownList.Seleccionar.GetHashCode().ToString()));
                }

                using (SETurnoClient proxy = new SETurnoClient("BasicHttpBinding_ISETurno"))
                {
                    this.Bind(this.ddlTurno, proxy.ObtenerListItem().ToList());
                    this.ddlTurno.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.SELECCIONE, TipoDropDownList.Seleccionar.GetHashCode().ToString()));
                }

                using (SEEmpresaContratistaClient proxy = new SEEmpresaContratistaClient("BasicHttpBinding_ISEEmpresaContratista"))
                {
                    this.Bind(this.ddlEmpresa, proxy.ObtenerListItem().ToList());
                    this.ddlEmpresa.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.SELECCIONE, TipoDropDownList.Seleccionar.GetHashCode().ToString()));
                    this.ddlEmpresa.SelectedValue = System.Configuration.ConfigurationManager.AppSettings["codigoEmpresaColquisiri"].ToString();
                    this.ddlEmpresa.Enabled = false;
                }

                if (this.hidAccion.Value.CompareTo(enmAccionRealizar.Nuevo.GetHashCode().ToString()) == 0)
                {
                    CargarMaquina();
                    int codigoGenerado = GenerarCodigoAvance();
                    this.txtCodigo.Text = codigoGenerado.ToString();                    
                }
            }
            catch (Exception ex)
            {

                Logger.Error("frmAvancePerforacionRegitro:CargarCombos", ex);
            }
        }

        private int GenerarCodigoAvance()
        {
            int codigoAvance = 0;
            try
            {
                using (SEAvanceDiarioClient proxy = new SEAvanceDiarioClient("BasicHttpBinding_ISEAvanceDiario"))
                {
                    codigoAvance = proxy.GenerarCodigoAvanceDiario(this.hidAnio.Value, this.hidMes.Value);
                }
            }
            catch (Exception ex)
            {

                Logger.Error("frmAvancePerforacionRegitro:GenerarCodigoAvance", ex);
            }
            return codigoAvance;

        }

        private void CarcularTotalHorasTurno()
        {
            double total = 0;
            try
            {
                this.listaAvanceDiarioSondajes = (List<AvanceDiarioSondajeResponse>)Session[SESSION_PERFORACION];
                if (this.listaAvanceDiarioSondajes != null)
                {
                    foreach (var item in this.listaAvanceDiarioSondajes)
                    {
                        total = total + (item.AvanceHasta - item.AvanceDesde);
                    }
                }
            }
            catch (Exception ex)
            {

                Logger.Error("frmAvancePerforacionRegitro:CarcularTotalHorasTurno", ex);
            }
            this.txtTotalTurno.Text = total.ToString();
        }

        private void ListarSondajes(int opcion = 0)
        {
            try
            {
                if (opcion == 0)
                {
                    using (SEAvanceDiarioSonsajesClient proxy = new SEAvanceDiarioSonsajesClient("BasicHttpBinding_ISEAvanceDiarioSonsajes"))
                    {
                        this.listaAvanceDiarioSondajes = proxy.ListarAvanceDiarioSonsajesPorAvanceDiario1(int.Parse(this.hidCodigo.Value)).ToList();
                        this.rgSondajes.DataSource = listaAvanceDiarioSondajes;
                        this.rgSondajes.DataBind();
                        Session[SESSION_PERFORACION] = this.listaAvanceDiarioSondajes;
                    }
                }
                else
                {
                    this.listaAvanceDiarioSondajes = (List<AvanceDiarioSondajeResponse>)Session[SESSION_PERFORACION];
                    this.rgSondajes.DataSource = listaAvanceDiarioSondajes;
                    this.rgSondajes.DataBind();

                }
                CarcularTotalHorasTurno();
            }
            catch (Exception ex)
            {

                Logger.Error("frmAvancePerforacionRegitro:CargarSondajes", ex);
            }
        }

        private void ListarConsumo()
        {
            try
            {
                using (SEConsumoClient proxy = new SEConsumoClient("BasicHttpBinding_ISEConsumo"))
                {
                    var lista = proxy.ListarAvanceDiarioConsumo(int.Parse(this.hidCodigo.Value)).ToList();
                    this.rgConsumo.DataSource = lista;
                    this.rgConsumo.DataBind();
                    int pos = 1;
                    foreach (var item in lista)
                    {
                        item.Orden = pos;
                        pos++;
                    }
                    Session[SESSION_CONSUMO] = lista;
                }
            }
            catch (Exception ex)
            {

                Logger.Error("frmAvancePerforacionRegitro:ListarConsumo", ex);
            }
        }

        private void ListarEntubacion()
        {
            try
            {
                using (SEEntubacionClient proxy = new SEEntubacionClient("BasicHttpBinding_ISEEntubacion"))
                {
                    var lista = proxy.ListarAvanceDiarioEntubacion(int.Parse(this.hidCodigo.Value));
                    this.rgEntubacion.DataSource = lista;
                    this.rgEntubacion.DataBind();
                    Session[SESSION_ENTUBACION] = lista.ToList();
                }

            }
            catch (Exception ex)
            {

                Logger.Error("frmAvancePerforacionRegitro:ListarEntubacion", ex);
            }
        }

        private void MostrarDistribucionTrabajo()
        {
            try
            {
                this.listaDistribucionTrabajo = (List<listarAvanceDiarioDistribucionTrabajo_Result>)Session[SESSION_DISTRIBUCION_TRABAJO];

                if (this.listaDistribucionTrabajo == null)
                {
                    using (SEDistribucionTrabajoClient proxy = new SEDistribucionTrabajoClient("BasicHttpBinding_ISEDistribucionTrabajo"))
                    {
                        this.listaDistribucionTrabajo = proxy.ListarAvanceDiarioDistribucionTrabajo(int.Parse(this.hidCodigo.Value)).ToList();
                        this.rgDistribucion.DataSource = this.listaDistribucionTrabajo;
                        this.rgDistribucion.DataBind();
                        Session[SESSION_DISTRIBUCION_TRABAJO] = this.listaDistribucionTrabajo;
                    }
                }
                else
                {
                    this.rgDistribucion.DataSource = this.listaDistribucionTrabajo;
                    this.rgDistribucion.DataBind();
                    Session[SESSION_DISTRIBUCION_TRABAJO] = this.listaDistribucionTrabajo;
                }

                this.lblTotalHoras.Text = this.txtTotalHoras.Text;
                this.mpDistribucion.Show();
            }
            catch (Exception ex)
            {

                Logger.Error("frmAvancePerforacionRegitro:MostrarDistribucionTrabajo", ex);
            }
        }

        protected override void Limpiar()
        {
            this.hidCodigo.Value = "0";
            this.ddlGeologo.SelectedValue = TipoDropDownList.Seleccionar.GetHashCode().ToString();

            this.txtFecha.SelectedDate = null;
            this.txtDescripcion.Text = string.Empty;

            OcultarMensaje();
            OcultarMensajeValidacion();
        }

        private void Habilitar(bool estado = true)
        {
            this.ddlMaquina.Enabled = estado;
            this.ddlGeologo.Enabled = estado;
            this.txtFecha.Enabled = estado;
            this.txtDescripcion.Enabled = estado;
            this.ddlPerforista.Enabled = estado;
            this.ddlTurno.Enabled = estado;
            this.ddlAyudante.Enabled = estado;
            this.ddlGeologo.Enabled = estado;
            this.txtSalida.Enabled = estado;

            this.ibtnGuardar.Visible = estado;
        }

        private void MostrarDetalle(int codigoAvanceDiario, enmAccionRealizar accionRealizar)
        {
            try
            {
                this.hidCodigo.Value = codigoAvanceDiario.ToString();
                if (accionRealizar == enmAccionRealizar.Edicion)
                {
                    //Carga detalla de pantalla en modo Edicion
                    this.CargarDatos(codigoAvanceDiario);
                    Habilitar(true);
                    this.ddlMaquina.Enabled = false;
                    this.txtSalida.Enabled = false;
                }
                else if (accionRealizar == enmAccionRealizar.Ver)
                {
                    //Carga detalla de pantalla en modo Consulta
                    this.CargarDatos(codigoAvanceDiario);
                    Habilitar(false);
                    this.ddlMaquina.Enabled = false;
                    this.txtSalida.Enabled = false;
                }
                else if (accionRealizar == enmAccionRealizar.Nuevo)
                {
                    //Carga detalla de pantalla en modo Nuevo
                    Limpiar();
                    Habilitar(true);
                }

                this.ListarSondajes();
                this.ListarConsumo();
                this.ListarEntubacion();

                //OcultarMensaje();
                OcultarMensajeValidacion();

                //this.mpRegistro.Show();
            }
            catch (Exception ex)
            {

                Logger.Error("frmAvancePerforacionRegitro:MostrarDetalle", ex);
            }
        }

        private void MostrarDetallePerforacion(int codigoSondaje, enmAccionRealizar accionRealizar)
        {
            try
            {
                this.hidDato.Value = "0";
                this.hidCodigoSondaje.Value = codigoSondaje.ToString();
                if (accionRealizar == enmAccionRealizar.Edicion)
                {
                    //Carga detalla de pantalla en modo Edicion
                    BuscarDetallePerforacion(codigoSondaje);
                    this.ibtnConsultar.Enabled = false;
                    this.ibtnConsultar.ToolTip = BUTTON_TOOLTIP_DESHABILITADO;
                }
                else if (accionRealizar == enmAccionRealizar.Ver)
                {
                    //Carga detalla de pantalla en modo Consulta
                    BuscarDetallePerforacion(codigoSondaje);
                    this.ibtnConsultar.Enabled = false;
                    this.ibtnConsultar.ToolTip = BUTTON_TOOLTIP_DESHABILITADO;
                }
                else if (accionRealizar == enmAccionRealizar.Nuevo)
                {
                    //Carga detalla de pantalla en modo Nuevo                    
                    this.hidCodigoSondaje.Value = "0";
                    this.txtNombreDDH.Text = string.Empty;
                    this.txtInclinacion.Text = string.Empty;
                    this.txtSeccion.Text = string.Empty;
                    this.txtZona.Text = string.Empty;
                    this.txtLabor.Text = string.Empty;
                    this.txtAzimut.Text = string.Empty;
                    this.ibtnConsultar.Enabled = true;
                    this.ibtnConsultar.ToolTip = "Consultar Sondajes";

                    //Obtengo por defecto el ultimo sondaje registrado por Maquina
                    if (this.ddlMaquina.SelectedValue != null && this.ddlMaquina.SelectedValue.CompareTo("0") != 0)
                    {
                        using (var proxy = new SEAvanceDiarioClient("BasicHttpBinding_ISEAvanceDiario"))
                        {
                            int ultimoCodigoSondaje = proxy.ObtenerUltimoCodSondajeADiarioMaquina(int.Parse(this.ddlMaquina.SelectedValue));
                            if (ultimoCodigoSondaje != 0)
                            {
                                this.hidCodigoSondaje.Value = ultimoCodigoSondaje.ToString();
                                this.hidDato.Value = ultimoCodigoSondaje.ToString();
                                CargarSondaje();
                            }
                        }
                    }

                    BuscarDetallePerforacion(0);
                }

                //ListarSondajes(1);

                OcultarMensajeValidacionPerforacion();

                this.mpPerforacion.Show();
            }
            catch (Exception ex)
            {

                Logger.Error("frmAvancePerforacionRegitro:MostrarDetalle", ex);
            }
        }

        private void CargarDatos(int codigoAvanceDiario)
        {
            try
            {
                using (var proxy = new SEAvanceDiarioClient("BasicHttpBinding_ISEAvanceDiario"))
                {
                    var item = proxy.ObtenerAvanceDiario(codigoAvanceDiario);
                    if (item != null)
                    {
                        this.hidCodigo.Value = item.CodigoAvanceDiario.ToString();
                        this.txtCodigo.Text = item.CodigoAvanceDiario.ToString();
                        this.ddlTurno.SelectedValue = item.Turno.ToString();
                        this.txtEntrada.Text = item.IniHorometro.ToString();
                        this.txtSalida.Text = item.FinHorometro.ToString();
                        this.txtHorasOperacion.Text = item.HorasOperacion.ToString();

                        this.txtTotalTurno.Text = item.AvanceTotal.ToString();

                        this.ddlEmpresa.SelectedValue = item.CodigoEmpresa.ToString();
                        CargarMaquina();
                        this.ddlMaquina.SelectedValue = item.CodigoMaquina.ToString();

                        this.ddlPerforista.SelectedValue = item.CodigoPerforista.ToString();

                        if (!string.IsNullOrEmpty(item.CodigoAyudante))
                            this.ddlAyudante.SelectedValue = item.CodigoAyudante.ToString();
                        else
                            this.ddlAyudante.SelectedValue = TipoDropDownList.Ninguno.GetHashCode().ToString();

                        this.txtDescripcion.Text = item.Descripcion;
                        this.ddlGeologo.SelectedValue = item.CodigoGeologo.ToString();

                        this.hidAnio.Value = item.Anio;
                        this.hidMes.Value = item.Mes;
                        if (item.Fecha == null)
                            this.txtFecha.SelectedDate = null;
                        else
                            this.txtFecha.SelectedDate = item.Fecha;

                        this.txtTotalHoras.Text = (item.CantidadTotalHorasTrabajadas != null) ? item.CantidadTotalHorasTrabajadas.ToString() : "0.00";
                    }
                }
            }
            catch (Exception ex)
            {

                Logger.Error("frmAvancePerforacionRegitro:CargarDatos", ex);
            }
        }

        private void CerrarDistribucionTrabajo()
        {
            Session[SESSION_DISTRIBUCION_TRABAJO] = null;
            this.mpDistribucion.Hide();
        }

        private void CerrarPerforacion()
        {
            Session[SESSION_PERFORACION_DETALLE] = null;
            this.mpPerforacion.Hide();
        }

        #region Mensajes
        protected override void MostrarMensajeValidacion(string mensaje)
        {
            this.pnlMensajeValidacion.Visible = true;
            this.lblMensajeValidacion.Text = mensaje;
        }

        protected override void OcultarMensajeValidacion()
        {
            this.pnlMensajeValidacion.Visible = false;
            this.lblMensajeValidacion.Text = string.Empty;
        }

        private void MostrarMensajeValidacionPerforacion(string mensaje)
        {
            this.pnlMensajePerforacion.Visible = true;
            this.lblMensajePerforacion.Text = mensaje;
        }

        private void OcultarMensajeValidacionPerforacion()
        {
            this.pnlMensajePerforacion.Visible = false;
            this.lblMensajePerforacion.Text = string.Empty;
        }

        #endregion

        protected override bool Validar(ref  StringBuilder sb)
        {
            bool retorno = true;
            try
            {
                //NO debe repetirse Consumo
                var listaConsumo = (List<listarAvanceDiarioConsumo_Result>)Session[SESSION_CONSUMO];
                if (listaConsumo != null && listaConsumo.Count > 0)
                {
                    if (listaConsumo.Select(x => x.CodigoProducto).Distinct().Count() < listaConsumo.Count)
                    {
                        sb.AppendLine("En consumo no se puede agregar productos repetidos");
                        retorno = false;
                    }
                }

                //NO debe repetirse Entubacion
                var listaEntubacion = (List<listarAvanceDiarioEntubacion_Result>)Session[SESSION_ENTUBACION];
                if (listaEntubacion != null && listaEntubacion.Count > 0)
                {
                    if (listaEntubacion.Select(x => x.CodigoProducto).Distinct().Count() < listaEntubacion.Count)
                    {
                        sb.AppendLine("En Entubación no se puede agregar tipos de productos repetidos");
                        retorno = false;
                    }
                }
            }
            catch (Exception ex)
            {
                retorno = false;
                Logger.Error("frmAvancePerforacionRegitro:Validar", ex);
            }
            return retorno;
        }

        protected override void Guardar()
        {
            //base.Guardar();
            try
            {
                //Antes de validar recupero
                //Recupero los detalles
                RecuperarConsumo();
                var listaConsumo = (List<listarAvanceDiarioConsumo_Result>)Session[SESSION_CONSUMO];

                //Entubacion
                RecuperarEntubacion();
                var listaEntubacion = (List<listarAvanceDiarioEntubacion_Result>)Session[SESSION_ENTUBACION];

                //Valido
                StringBuilder sb = new StringBuilder();
                if (!this.Validar(ref sb))
                {
                    this.MostrarMensajeValidacion(sb.ToString());
                    return;
                }

                AvanceDiario avanceDiario = new AvanceDiario();
                avanceDiario.CodigoAvanceDiario = int.Parse(this.hidCodigo.Value);
                avanceDiario.Fecha = (DateTime)this.txtFecha.SelectedDate;
                avanceDiario.Turno = short.Parse(this.ddlTurno.SelectedValue.ToString());
                avanceDiario.IniHorometro = double.Parse(this.txtEntrada.Text);
                avanceDiario.FinHorometro = double.Parse(this.txtSalida.Text);
                avanceDiario.AvanceTotal = double.Parse(this.txtTotalTurno.Text);
                avanceDiario.HorasOperacion = double.Parse(this.txtHorasOperacion.Text);
                avanceDiario.CodigoEmpresa = int.Parse(this.ddlEmpresa.SelectedValue);
                avanceDiario.CodigoMaquina = int.Parse(this.ddlMaquina.SelectedValue);
                avanceDiario.CodigoPerforista = this.ddlPerforista.SelectedValue;

                if (this.ddlAyudante.SelectedValue.CompareTo(TipoDropDownList.Ninguno.GetHashCode().ToString()) != 0)
                    avanceDiario.CodigoAyudante = this.ddlAyudante.SelectedValue;
                else
                    avanceDiario.CodigoAyudante = null;

                avanceDiario.Anio = this.hidAnio.Value;
                avanceDiario.Mes = this.hidMes.Value;
                avanceDiario.Descripcion = this.txtDescripcion.Text.Trim();
                avanceDiario.CodigoGeologo = int.Parse(this.ddlGeologo.SelectedValue);
                avanceDiario.CantidadTotalHorasTrabajadas = decimal.Parse(this.txtTotalHoras.Text);

                this.listaAvanceDiarioSondajes = (List<AvanceDiarioSondajeResponse>)Session[SESSION_PERFORACION];
                List<AvanceDiarioSonsajes> avancesSondajes = new List<AvanceDiarioSonsajes>();
                AvanceDiarioSonsajes avanceSondaje = null;

                List<DetallePerforacion> listaDetalles = null;
                DetallePerforacion detalle = null;

                if (this.listaAvanceDiarioSondajes != null)
                {
                    foreach (var item in this.listaAvanceDiarioSondajes)
                    {
                        avanceSondaje = new AvanceDiarioSonsajes();
                        avanceSondaje.CodigoAvanceDiario = int.Parse(this.hidCodigo.Value);
                        avanceSondaje.CodigoSondaje = item.CodigoSondaje;
                        //avanceSondaje.Rumbo = item.Rumbo;
                        avanceSondaje.AvanceDesde = item.AvanceDesde;
                        avanceSondaje.AvanceHasta = item.AvanceHasta;


                        if (item.Detalles != null)
                        {
                            listaDetalles = new List<DetallePerforacion>();
                            foreach (var detalleItem in item.Detalles)
                            {
                                detalle = new DetallePerforacion();
                                detalle.Orden = detalleItem.Orden;
                                detalle.CodigoAvanceDiario = int.Parse(this.hidCodigo.Value);
                                detalle.CodigoSondaje = avanceSondaje.CodigoSondaje;
                                detalle.Desde = detalleItem.Desde;
                                detalle.Hasta = detalleItem.Hasta;
                                detalle.MetrosPerforados = detalleItem.MetrosPerforados;
                                detalle.MetrosRecuperados = detalleItem.MetrosRecuperados;
                                detalle.PorcentajeRecuperacion = detalleItem.PorcentajeRecuperacion;
                                detalle.CodigoProductoCorona = detalleItem.CodigoProductoCorona;
                                detalle.CodigoProductoEscariador = detalleItem.CodigoProductoEscariador;
                                listaDetalles.Add(detalle);
                            }

                            //Lista de perforacion
                            avanceSondaje.DetallePerforacion = listaDetalles.ToArray();
                        }

                        //Lista de avances diarios por sondaje
                        avancesSondajes.Add(avanceSondaje);
                    }
                }
                avanceDiario.AvanceDiarioSonsajes = avancesSondajes.ToArray();

                //Consumo
                List<Consumo> consumos = new List<Consumo>();
                Consumo consumo = null;
                if (listaConsumo != null)
                {
                    foreach (var item in listaConsumo)
                    {
                        if (item.CodigoProducto != 0)
                        {
                            consumo = new Consumo();
                            consumo.CodigoAvanceDiario = int.Parse(this.hidCodigo.Value);
                            consumo.CodigoProducto = item.CodigoProducto;
                            consumo.Cantidad = item.Cantidad;
                            consumos.Add(consumo);
                        }
                    }
                }
                avanceDiario.Consumo = consumos.ToArray();

                //Entubacion
                List<Entubacion> entubaciones = new List<Entubacion>();
                Entubacion entubacion = null;
                if (listaEntubacion != null)
                {
                    foreach (var item in listaEntubacion)
                    {
                        if (item.CodigoProducto != 0)
                        {
                            entubacion = new Entubacion();
                            entubacion.CodigoAvanceDiario = int.Parse(this.hidCodigo.Value);
                            entubacion.CodigoProducto = item.CodigoProducto;
                            entubacion.Colocados = item.Colocados;
                            entubacion.Perdidos = item.Perdidos;
                            entubacion.Metros = item.Metros;
                            entubaciones.Add(entubacion);
                        }
                    }
                }
                avanceDiario.Entubacion = entubaciones.ToArray();

                //Distribucion de Trabajo
                var distribucionTrabajo = (List<listarAvanceDiarioDistribucionTrabajo_Result>)Session[SESSION_DISTRIBUCION_TRABAJO];
                List<DistribucionTrabajo> distribuciones = new List<DistribucionTrabajo>();
                DistribucionTrabajo distribucion = null;
                if (distribucionTrabajo != null)
                {
                    foreach (var item in distribucionTrabajo)
                    {
                        if (item.CantidadHoras > 0)
                        {
                            distribucion = new DistribucionTrabajo();
                            distribucion.CodigoAvanceDiario = int.Parse(this.hidCodigo.Value);
                            distribucion.CodigoTarea = item.CodigoTarea;
                            distribucion.CantidadHoras = item.CantidadHoras;
                            distribuciones.Add(distribucion);
                        }
                    }
                }
                avanceDiario.DistribucionTrabajo = distribuciones.ToArray();
                string result = string.Empty;
                using (var proxy = new SEAvanceDiarioClient("BasicHttpBinding_ISEAvanceDiario"))
                {
                    if (this.hidCodigo.Value.CompareTo("0") == 0)

                        result = proxy.InsertarAvanceDiario(avanceDiario);

                    else

                        result = proxy.ModificarAvanceDiario(avanceDiario);
                }

                if (result.CompareTo("Registrado") != 0)
                {
                    this.MostrarMensajeValidacion(result);
                }
                else
                {
                    LimpiarDetalles();
                    Response.Redirect("frmAvancePerforacion.aspx", false);
                }
            }
            catch (Exception ex)
            {
                this.MostrarMensaje(MSG_ERROR_GRABAR, enmTipoMensajeMostrar.Error);
                Logger.Error("frmAvancePerforacionRegitro:Guardar", ex);
            }
        }
        #endregion

        #region Eventos

        protected void imgClose_Click(object sender, ImageClickEventArgs e)
        {
            CerrarPerforacion();
        }

        protected void ibtnRegistrar_Click(object sender, ImageClickEventArgs e)
        {
            MostrarDetalle(0, enmAccionRealizar.Nuevo);
        }

        protected void ibtnGuardar_Click(object sender, ImageClickEventArgs e)
        {
            Guardar();
        }

        protected void ibtnCancelar_Click(object sender, ImageClickEventArgs e)
        {
            Response.Redirect("frmAvancePerforacion.aspx", false);
        }

        #endregion

        protected void CargarMaquina()
        {
            try
            {
                using (SEMaquinaClient proxy = new SEMaquinaClient("BasicHttpBinding_ISEMaquina"))
                {
                    this.Bind(this.ddlMaquina, proxy.ObtenerListItem2(int.Parse(this.ddlEmpresa.SelectedValue), enmDiamantino.EsDiamantino.GetHashCode()).ToList());
                    this.ddlMaquina.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.SELECCIONE, TipoDropDownList.Seleccionar.GetHashCode().ToString()));
                }
            }
            catch (Exception ex)
            {

                Logger.Error("frmAvancePerforacionRegitro:CargarMaquina", ex);
            }
        }

        private void RecuperarDetallePerforacion()
        {
            try
            {
                int pos = 1;
                if (this.listaDetallePerforacion == null) this.listaDetallePerforacion = new List<DetallePerforacionResponse>();
                this.listaDetallePerforacion.Clear();

                foreach (GridDataItem item in this.rgPerforacion.Items)
                {

                    DetallePerforacionResponse detalle = null;
                    if (item.ItemType == GridItemType.AlternatingItem || item.ItemType == GridItemType.Item)
                    {
                        detalle = new DetallePerforacionResponse();

                        RadNumericTextBox txtDesde = (RadNumericTextBox)item.FindControl("txtDesde");
                        RadNumericTextBox txtHasta = (RadNumericTextBox)item.FindControl("txtHasta");
                        TextBox txtMetrosPerforados = (TextBox)item.FindControl("txtMetrosPerforados");
                        RadNumericTextBox txtMetrosRecuperados = (RadNumericTextBox)item.FindControl("txtMetrosRecuperados");
                        TextBox txtPorcentajeRecuperacion = (TextBox)item.FindControl("txtPorcentajeRecuperacion");

                        DropDownList ddlProductoCorona = (DropDownList)item.FindControl("ddlProductoCorona");
                        DropDownList ddlProductoEscariador = (DropDownList)item.FindControl("ddlProductoEscariador");

                        if (string.IsNullOrEmpty(txtDesde.Text)) txtDesde.Text = "0";
                        if (string.IsNullOrEmpty(txtHasta.Text)) txtHasta.Text = "0";
                        if (string.IsNullOrEmpty(txtMetrosPerforados.Text)) txtMetrosPerforados.Text = "0";
                        if (string.IsNullOrEmpty(txtMetrosRecuperados.Text)) txtMetrosRecuperados.Text = "0";
                        if (string.IsNullOrEmpty(txtPorcentajeRecuperacion.Text)) txtPorcentajeRecuperacion.Text = "0";

                        detalle.Orden = pos;
                        detalle.Orden = this.listaDetallePerforacion.Count + 1;
                        detalle.Desde = double.Parse(txtDesde.Text);
                        detalle.Hasta = double.Parse(txtHasta.Text);
                        detalle.MetrosPerforados = double.Parse(txtMetrosPerforados.Text);
                        detalle.MetrosRecuperados = double.Parse(txtMetrosRecuperados.Text);
                        detalle.PorcentajeRecuperacion = double.Parse(txtPorcentajeRecuperacion.Text);
                        detalle.CodigoProductoCorona = int.Parse(ddlProductoCorona.SelectedValue);
                        detalle.CodigoProductoEscariador = int.Parse(ddlProductoEscariador.SelectedValue);
                        detalle.NombreProductoCorona = string.Empty;
                        detalle.NombreProductoEscariador = string.Empty;

                        this.listaDetallePerforacion.Add(detalle);
                        pos++;
                    }
                }

                Session[SESSION_PERFORACION_DETALLE] = this.listaDetallePerforacion;

            }
            catch (Exception ex)
            {

                Logger.Error("frmAvancePerforacionRegitro:RecuperarDetallePerforacion", ex);
            }
        }

        private void RecuperarConsumo()
        {
            try
            {
                int pos = 1;
                List<listarAvanceDiarioConsumo_Result> lista = new List<listarAvanceDiarioConsumo_Result>();
                foreach (GridDataItem item in this.rgConsumo.Items)
                {

                    listarAvanceDiarioConsumo_Result detalle = null;
                    if (item.ItemType == GridItemType.AlternatingItem || item.ItemType == GridItemType.Item)
                    {
                        detalle = new listarAvanceDiarioConsumo_Result();

                        RadNumericTextBox txtCantidad = (RadNumericTextBox)item.FindControl("txtCantidad");
                        DropDownList ddlProducto = (DropDownList)item.FindControl("ddlProducto");

                        if (txtCantidad.Text.Length == 0) txtCantidad.Text = "0";
                        detalle.Orden = pos;
                        detalle.CodigoProducto = int.Parse(ddlProducto.SelectedValue);
                        detalle.Cantidad = decimal.Parse(txtCantidad.Text);

                        lista.Add(detalle);
                        pos++;
                    }

                    Session[SESSION_CONSUMO] = lista;
                }

            }
            catch (Exception ex)
            {

                Logger.Error("frmAvancePerforacionRegitro:RecuperarConsumo", ex);
            }

        }


        private void RecuperarEntubacion()
        {
            try
            {
                int pos = 1;
                List<listarAvanceDiarioEntubacion_Result> lista = new List<listarAvanceDiarioEntubacion_Result>();
                foreach (GridDataItem item in this.rgEntubacion.Items)
                {

                    listarAvanceDiarioEntubacion_Result detalle = null;
                    if (item.ItemType == GridItemType.AlternatingItem || item.ItemType == GridItemType.Item)
                    {
                        detalle = new listarAvanceDiarioEntubacion_Result();

                        DropDownList ddlProducto = (DropDownList)item.FindControl("ddlProducto");
                        RadNumericTextBox txtColocados = (RadNumericTextBox)item.FindControl("txtColocados");
                        RadNumericTextBox txtPerdidos = (RadNumericTextBox)item.FindControl("txtPerdidos");
                        RadNumericTextBox txtMetros = (RadNumericTextBox)item.FindControl("txtMetros");


                        if (txtColocados.Text.Length == 0) txtColocados.Text = "0";
                        if (txtPerdidos.Text.Length == 0) txtPerdidos.Text = "0";
                        if (txtMetros.Text.Length == 0) txtMetros.Text = "0";

                        detalle.Orden = pos;
                        detalle.CodigoAvanceDiario = int.Parse(this.hidCodigo.Value);
                        detalle.CodigoProducto = int.Parse(ddlProducto.SelectedValue);
                        detalle.Colocados = double.Parse(txtColocados.Text);
                        detalle.Perdidos = double.Parse(txtPerdidos.Text);
                        detalle.Metros = double.Parse(txtMetros.Text);

                        lista.Add(detalle);
                        pos++;
                    }

                    Session[SESSION_ENTUBACION] = lista;
                }
            }
            catch (Exception ex)
            {

                Logger.Error("frmAvancePerforacionRegitro:RecuperarEntubacion", ex);
            }
        }

        private void CalcularHorasDistribucion()
        {
            try
            {
                List<listarAvanceDiarioDistribucionTrabajo_Result> lista = (List<listarAvanceDiarioDistribucionTrabajo_Result>)Session[SESSION_DISTRIBUCION_TRABAJO];

                decimal totalHorasTrabajadas = 0;
                if (lista.Count > 0)
                {
                    totalHorasTrabajadas = lista.Sum(x => x.CantidadHoras);
                }
                this.txtTotalHoras.Text = totalHorasTrabajadas.ToString();
            }
            catch (Exception ex)
            {

                Logger.Error("frmAvancePerforacionRegitro:CalcularHorasDistribucion", ex);
            }
        }

        private void RecuperarDistribuion()
        {
            try
            {
                List<listarAvanceDiarioDistribucionTrabajo_Result> lista = new List<listarAvanceDiarioDistribucionTrabajo_Result>();
                foreach (GridDataItem item in this.rgDistribucion.Items)
                {

                    listarAvanceDiarioDistribucionTrabajo_Result detalle = null;
                    if (item.ItemType == GridItemType.AlternatingItem || item.ItemType == GridItemType.Item)
                    {
                        int codigoTarea = int.Parse(item.GetDataKeyValue("CodigoTarea").ToString());

                        RadNumericTextBox txtCantidadHoras = (RadNumericTextBox)item.FindControl("txtCantidadHoras");
                        DropDownList ddlProducto = (DropDownList)item.FindControl("ddlProducto");
                        if (string.IsNullOrEmpty(txtCantidadHoras.Text)) txtCantidadHoras.Text = "0";

                        detalle = new listarAvanceDiarioDistribucionTrabajo_Result();
                        detalle.CodigoAvanceDiario = int.Parse(this.hidCodigo.Value);
                        detalle.CodigoTarea = codigoTarea;
                        detalle.NombreTarea = item.GetDataKeyValue("NombreTarea").ToString();
                        detalle.CantidadHoras = decimal.Parse(txtCantidadHoras.Text);
                        lista.Add(detalle);
                    }

                }
                Session[SESSION_DISTRIBUCION_TRABAJO] = lista;
                CalcularHorasDistribucion();
            }
            catch (Exception ex)
            {

                Logger.Error("frmAvancePerforacionRegitro:RecuperarDistribuion", ex);
            }

        }

        protected void ibtnPerforacion_Click(object sender, ImageClickEventArgs e)
        {
            this.MostrarDetallePerforacion(0, enmAccionRealizar.Nuevo);
        }

        protected void ibtnDistribucion_Click(object sender, ImageClickEventArgs e)
        {
            MostrarDistribucionTrabajo();
        }

        protected void ibtnAgregarDetallePerforacion_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                DetallePerforacionResponse item = new DetallePerforacionResponse();
                RecuperarDetallePerforacion();

                this.listaDetallePerforacion = (List<DetallePerforacionResponse>)Session[SESSION_PERFORACION_DETALLE];
                if (this.listaDetallePerforacion == null) this.listaDetallePerforacion = new List<DetallePerforacionResponse>();

                //Obtengo ultimo avance
                obtenerUltimoAvanceMaquina_Result ultimoAvance = new obtenerUltimoAvanceMaquina_Result();
                if (this.listaDetallePerforacion.Count == 0)
                {
                    if (this.ddlMaquina.SelectedValue != null && this.ddlMaquina.SelectedValue.CompareTo("0") != 0)
                    {
                        using (var proxy = new SEAvanceDiarioClient("BasicHttpBinding_ISEAvanceDiario"))
                        {
                            ultimoAvance = proxy.ObtenerUltimoAvanceMaquina(int.Parse(this.ddlMaquina.SelectedValue));
                        }
                    }
                }

                if (ultimoAvance == null)
                {
                    ultimoAvance = new obtenerUltimoAvanceMaquina_Result();
                    ultimoAvance.CodigoProductoCorona = 0;
                    ultimoAvance.CodigoProductoEscariador = 0;
                    ultimoAvance.Hasta = 0;
                }

                item.Orden = this.listaDetallePerforacion.Count + 1;

                var listaMaxima = this.listaDetallePerforacion.OrderByDescending(x => x.Orden).FirstOrDefault();

                item.Desde = (listaMaxima != null) ? listaMaxima.Hasta : ultimoAvance.Hasta;
                item.Hasta = 0;
                item.MetrosPerforados = 0;
                item.MetrosRecuperados = 0;
                item.PorcentajeRecuperacion = 0;
                item.CodigoProductoCorona = (listaMaxima != null) ? listaMaxima.CodigoProductoCorona : ultimoAvance.CodigoProductoCorona;
                item.CodigoProductoEscariador = (listaMaxima != null) ? listaMaxima.CodigoProductoEscariador : ultimoAvance.CodigoProductoEscariador;
                item.NombreProductoCorona = string.Empty;
                item.NombreProductoEscariador = string.Empty;

                this.listaDetallePerforacion.Add(item);
                this.rgPerforacion.DataSource = this.listaDetallePerforacion;
                this.rgPerforacion.DataBind();
                Session[SESSION_PERFORACION_DETALLE] = this.listaDetallePerforacion;



            }
            catch (Exception ex)
            {

                Logger.Error("frmAvancePerforacionRegitro:CargarMaquina", ex);
            }
        }

        protected void rgPerforacion_ItemDataBound(object sender, GridItemEventArgs e)
        {
            try
            {
                if (e.Item.ItemType == GridItemType.Item || e.Item.ItemType == GridItemType.AlternatingItem)
                {
                    GridDataItem item = (GridDataItem)e.Item;
                    DropDownList ddlProductoCorona = (DropDownList)item.FindControl("ddlProductoCorona");
                    DropDownList ddlProductoEscariador = (DropDownList)item.FindControl("ddlProductoEscariador");
                    var productosCorona = (List<ListItemInt>)Session[SESSION_PRODUCTOS_CORONA];
                    Bind(ddlProductoCorona, productosCorona);
                    ddlProductoCorona.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.SELECCIONE, TipoDropDownList.Seleccionar.GetHashCode().ToString()));
                    ddlProductoCorona.SelectedValue = ((GridDataItem)e.Item).GetDataKeyValue("CodigoProductoCorona").ToString();

                    var productosEscariador = (List<ListItemInt>)Session[SESSION_PRODUCTOS_ESCARIADOR];
                    Bind(ddlProductoEscariador, productosEscariador);
                    ddlProductoEscariador.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.SELECCIONE, TipoDropDownList.Seleccionar.GetHashCode().ToString()));
                    ddlProductoEscariador.SelectedValue = ((GridDataItem)e.Item).GetDataKeyValue("CodigoProductoEscariador").ToString();

                    RadNumericTextBox txtDesde = (RadNumericTextBox)item.FindControl("txtDesde");
                    RadNumericTextBox txtHasta = (RadNumericTextBox)item.FindControl("txtHasta");
                    txtDesde.Attributes.Add("onblur", "return calcularPerforacion();");
                    txtHasta.Attributes.Add("onblur", "return calcularPerforacion();");

                    RadNumericTextBox txtMetrosRecuperados = (RadNumericTextBox)item.FindControl("txtMetrosRecuperados");
                    txtMetrosRecuperados.Attributes.Add("onblur", "return calcularPorcentajePerforacion();");
                }
            }
            catch (Exception ex)
            {

                Logger.Error("frmAvancePerforacionRegitro:rgPerforacion_ItemDataBound", ex);
            }
        }

        protected void ibtnCancelarPerforacion_Click(object sender, ImageClickEventArgs e)
        {
            CerrarPerforacion();
        }

        protected void rgPerforacion_DeleteCommand(object sender, GridCommandEventArgs e)
        {
            try
            {
                int orden = int.Parse(((GridDataItem)e.Item).GetDataKeyValue("Orden").ToString());

                RecuperarDetallePerforacion();
                this.listaDetallePerforacion = (List<DetallePerforacionResponse>)Session[SESSION_PERFORACION_DETALLE];

                foreach (var item in this.listaDetallePerforacion)
                {
                    if (item.Orden == orden)
                    {
                        this.listaDetallePerforacion.Remove(item);
                        break;
                    }
                }

                Session[SESSION_PERFORACION_DETALLE] = this.listaDetallePerforacion;
                this.rgPerforacion.DataSource = this.listaDetallePerforacion;
                this.rgPerforacion.DataBind();
            }
            catch (Exception ex)
            {

                Logger.Error("frmAvancePerforacionRegitro:rgPerforacion_DeleteCommand", ex);
            }
        }

        protected void ibtnGuardarPerforacion_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                this.listaAvanceDiarioSondajes = (List<AvanceDiarioSondajeResponse>)Session[SESSION_PERFORACION];
                if (this.listaAvanceDiarioSondajes == null) this.listaAvanceDiarioSondajes = new List<AvanceDiarioSondajeResponse>();

                if (this.ibtnConsultar.Enabled)
                {
                    var existeSondaje = this.listaAvanceDiarioSondajes.Where(x => x.CodigoSondaje == int.Parse(this.hidCodigoSondaje.Value)).FirstOrDefault();
                    if (existeSondaje != null)
                    {
                        MostrarMensajeValidacionPerforacion("Sondaje seleccionado ya se encuentra registrado. Ingrese otro Sondaje");
                        return;
                    }
                }

                //Captura detalle de perforacion
                RecuperarDetallePerforacion();
                this.listaDetallePerforacion = (List<DetallePerforacionResponse>)Session[SESSION_PERFORACION_DETALLE];
                double desdeTotal = 0;
                double hastaTotal = 0;
                if (this.listaDetallePerforacion != null && this.listaDetallePerforacion.Count > 0)
                {
                    desdeTotal = this.listaDetallePerforacion.OrderBy(x => x.Desde).FirstOrDefault().Desde;
                    hastaTotal = this.listaDetallePerforacion.OrderByDescending(x => x.Hasta).FirstOrDefault().Hasta;
                }

                AvanceDiarioSondajeResponse item = new AvanceDiarioSondajeResponse();
                if (this.ibtnConsultar.Enabled)
                {
                    item.CodigoSondaje = int.Parse(this.hidCodigoSondaje.Value);
                    item.CodigoAvanceDiario = int.Parse(this.hidCodigo.Value);
                    item.NombreDDH = this.txtNombreDDH.Text;
                    item.NombreZona = this.txtZona.Text;
                    item.NombreLabor = this.txtLabor.Text;

                    item.Azimut = double.Parse(this.txtAzimut.Text);
                    item.AvanceDesde = desdeTotal;
                    item.AvanceHasta = hastaTotal;
                    item.Detalles = this.listaDetallePerforacion.ToArray();
                    this.listaAvanceDiarioSondajes.Add(item);
                }
                else
                {
                    var sondajeModicado = this.listaAvanceDiarioSondajes.Where(x => x.CodigoSondaje == int.Parse(this.hidCodigoSondaje.Value)).FirstOrDefault();
                    if (sondajeModicado != null)
                    {
                        this.listaAvanceDiarioSondajes.Where(x => x.CodigoSondaje == int.Parse(this.hidCodigoSondaje.Value)).FirstOrDefault().AvanceDesde = desdeTotal;
                        this.listaAvanceDiarioSondajes.Where(x => x.CodigoSondaje == int.Parse(this.hidCodigoSondaje.Value)).FirstOrDefault().AvanceHasta = hastaTotal;
                        this.listaAvanceDiarioSondajes.Where(x => x.CodigoSondaje == int.Parse(this.hidCodigoSondaje.Value)).FirstOrDefault().Azimut = double.Parse(this.txtAzimut.Text);
                        this.listaAvanceDiarioSondajes.Where(x => x.CodigoSondaje == int.Parse(this.hidCodigoSondaje.Value)).FirstOrDefault().Detalles = this.listaDetallePerforacion.ToArray();
                    }
                }

                this.rgSondajes.DataSource = this.listaAvanceDiarioSondajes;
                this.rgSondajes.DataBind();
                Session[SESSION_PERFORACION] = this.listaAvanceDiarioSondajes;
                CarcularTotalHorasTurno();

                CerrarPerforacion();

            }
            catch (Exception ex)
            {

                Logger.Error("frmAvancePerforacionRegitro:ibtnGuardarPerforacion_Click", ex);
            }
        }

        protected void rgSondajes_ItemCommand(object sender, GridCommandEventArgs e)
        {
            try
            {
                if (e.CommandName.CompareTo("Editar") == 0)
                {
                    var item = (GridEditableItem)e.Item;
                    int codigoSondaje = int.Parse(item.GetDataKeyValue("CodigoSondaje").ToString());
                    this.listaAvanceDiarioSondajes = (List<AvanceDiarioSondajeResponse>)Session[SESSION_PERFORACION];

                    var sondaje = this.listaAvanceDiarioSondajes.Where(x => x.CodigoSondaje == codigoSondaje).FirstOrDefault();
                    if (sondaje != null)
                    {

                        this.hidCodigoSondaje.Value = sondaje.CodigoSondaje.ToString();
                        CargarSondaje();

                        OcultarMensajeValidacion();
                        OcultarMensajeValidacionPerforacion();
                        MostrarDetallePerforacion(codigoSondaje, enmAccionRealizar.Edicion);

                    }
                }

            }
            catch (Exception ex)
            {

                Logger.Error("frmAvancePerforacionRegitro:rgSondajes_ItemCommand", ex);
            }
        }

        protected void rgSondajes_DeleteCommand(object sender, GridCommandEventArgs e)
        {
            try
            {
                int codigoSondaje = int.Parse(((GridDataItem)e.Item).GetDataKeyValue("CodigoSondaje").ToString());
                this.listaAvanceDiarioSondajes = (List<AvanceDiarioSondajeResponse>)Session[SESSION_PERFORACION];
                if (this.listaAvanceDiarioSondajes != null)
                {
                    foreach (var item in this.listaAvanceDiarioSondajes)
                    {
                        if (item.CodigoSondaje == codigoSondaje)
                        {
                            this.listaAvanceDiarioSondajes.Remove(item);
                            break;
                        }
                    }
                    Session[SESSION_PERFORACION] = this.listaAvanceDiarioSondajes;
                    CarcularTotalHorasTurno();
                }
                ListarSondajes(1);
            }
            catch (Exception ex)
            {

                Logger.Error("frmAvancePerforacionRegitro:rgSondajes_DeleteCommand", ex);
            }
        }

        protected void rgConsumo_ItemDataBound(object sender, GridItemEventArgs e)
        {
            try
            {
                if (e.Item.ItemType == GridItemType.Item || e.Item.ItemType == GridItemType.AlternatingItem)
                {
                    GridDataItem item = (GridDataItem)e.Item;
                    DropDownList ddlProducto = (DropDownList)item.FindControl("ddlProducto");
                    var productosConsumo = (List<ListItemInt>)Session[SESSION_PRODUCTOS_CONSUMO];
                    Bind(ddlProducto, productosConsumo);
                    ddlProducto.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.SELECCIONE, TipoDropDownList.Seleccionar.GetHashCode().ToString()));
                    ddlProducto.SelectedValue = ((GridDataItem)e.Item).GetDataKeyValue("CodigoProducto").ToString();
                }
            }
            catch (Exception ex)
            {

                Logger.Error("frmAvancePerforacionRegitro:rgConsumo_ItemDataBound", ex);
            }
        }

        protected void ibtnAgregarConsumo_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                RecuperarConsumo();
                var lista = (List<listarAvanceDiarioConsumo_Result>)Session[SESSION_CONSUMO];
                if (lista == null) lista = new List<listarAvanceDiarioConsumo_Result>();

                listarAvanceDiarioConsumo_Result item = new listarAvanceDiarioConsumo_Result();

                item.Orden = lista.Count + 1;
                item.CodigoProducto = 0;
                item.Cantidad = 0;

                lista.Add(item);
                this.rgConsumo.DataSource = lista;
                this.rgConsumo.DataBind();
                Session[SESSION_CONSUMO] = lista;
            }
            catch (Exception ex)
            {

                Logger.Error("frmAvancePerforacionRegitro:ibtnAgregarConsumo_Click", ex);
            }
        }

        protected void rgConsumo_DeleteCommand(object sender, GridCommandEventArgs e)
        {
            try
            {
                int orden = int.Parse(((GridDataItem)e.Item).GetDataKeyValue("Orden").ToString());
                RecuperarConsumo();
                var lista = (List<listarAvanceDiarioConsumo_Result>)Session[SESSION_CONSUMO];
                foreach (var item in lista)
                {
                    if (item.Orden == orden)
                    {
                        lista.Remove(item);
                        break;
                    }
                }

                this.rgConsumo.DataSource = lista;
                this.rgConsumo.DataBind();
                Session[SESSION_CONSUMO] = lista;
            }
            catch (Exception ex)
            {

                Logger.Error("frmAvancePerforacionRegitro:rgConsumo_DeleteCommand", ex);
            }
        }

        protected void ibtnAgregarEntubacion_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                RecuperarEntubacion();
                var lista = (List<listarAvanceDiarioEntubacion_Result>)Session[SESSION_ENTUBACION];
                if (lista == null) lista = new List<listarAvanceDiarioEntubacion_Result>();

                listarAvanceDiarioEntubacion_Result item = new listarAvanceDiarioEntubacion_Result();

                item.Orden = lista.Count + 1;
                item.CodigoProducto = 0;
                item.Colocados = 0;
                item.Perdidos = 0;
                item.Metros = 0;

                lista.Add(item);
                this.rgEntubacion.DataSource = lista;
                this.rgEntubacion.DataBind();
                Session[SESSION_ENTUBACION] = lista;
            }
            catch (Exception ex)
            {

                Logger.Error("frmAvancePerforacionRegitro:ibtnAgregarEntubacion_Click", ex);
            }
        }

        protected void rgEntubacion_ItemDataBound(object sender, GridItemEventArgs e)
        {
            try
            {
                if (e.Item.ItemType == GridItemType.Item || e.Item.ItemType == GridItemType.AlternatingItem)
                {
                    GridDataItem item = (GridDataItem)e.Item;
                    DropDownList ddlProducto = (DropDownList)item.FindControl("ddlProducto");
                    var producto = (List<ListItemInt>)Session[SESSION_PRODUCTOS_ENTUBACION];

                    RadNumericTextBox txtColocados = (RadNumericTextBox)item.FindControl("txtColocados");
                    RadNumericTextBox txtPerdidos = (RadNumericTextBox)item.FindControl("txtPerdidos");
                    RadNumericTextBox txtMetros = (RadNumericTextBox)item.FindControl("txtMetros");
                    txtColocados.Attributes.Add("onblur", "return recalcular();");
                    txtPerdidos.Attributes.Add("onblur", "return recalcular();");
                    txtMetros.Attributes.Add("onblur", "return recalcular();");

                    Bind(ddlProducto, producto);
                    ddlProducto.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.SELECCIONE, TipoDropDownList.Seleccionar.GetHashCode().ToString()));
                    ddlProducto.SelectedValue = ((GridDataItem)e.Item).GetDataKeyValue("CodigoProducto").ToString();
                }
            }
            catch (Exception ex)
            {

                Logger.Error("frmAvancePerforacionRegitro:rgEntubacion_ItemDataBound", ex);
            }
        }

        protected void rgEntubacion_DeleteCommand(object sender, GridCommandEventArgs e)
        {
            try
            {
                int orden = int.Parse(((GridDataItem)e.Item).GetDataKeyValue("Orden").ToString());

                RecuperarEntubacion();
                var lista = (List<listarAvanceDiarioEntubacion_Result>)Session[SESSION_ENTUBACION];

                foreach (var item in lista)
                {
                    if (item.Orden == orden)
                    {
                        lista.Remove(item);
                        break;
                    }
                }

                this.rgEntubacion.DataSource = lista;
                this.rgEntubacion.DataBind();
                Session[SESSION_ENTUBACION] = lista;
            }
            catch (Exception ex)
            {

                Logger.Error("frmAvancePerforacionRegitro:rgEntubacion_DeleteCommand", ex);
            }
        }

        protected void ibtnCancelarDistribucion_Click(object sender, ImageClickEventArgs e)
        {
            this.mpDistribucion.Hide();
        }

        protected void ibtnGuardarDistribucion_Click(object sender, ImageClickEventArgs e)
        {
            RecuperarDistribuion();
            this.mpDistribucion.Hide();
        }

        protected void ddlMaquina_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                using (SEMaquinaClient proxy = new SEMaquinaClient("BasicHttpBinding_ISEMaquina"))
                {
                    var maquina = proxy.ObtenerMaquina(int.Parse(this.ddlMaquina.SelectedValue));
                    if (maquina != null)
                        this.txtEntrada.Text = string.Format("{0:###,##0.00}", maquina.ContadorHorometro);
                    else
                        this.txtEntrada.Text = "0.00";
                }
            }
            catch (Exception ex)
            {

                Logger.Error("frmAvancePerforacionRegitro:rgEntubacion_DeleteCommand", ex);
            }
        }

        protected void rgDistribucion_ItemDataBound(object sender, GridItemEventArgs e)
        {
            if (e.Item.ItemType == GridItemType.Item || e.Item.ItemType == GridItemType.AlternatingItem)
            {
                GridDataItem item = (GridDataItem)e.Item;
                RadNumericTextBox txtCantidadHoras = (RadNumericTextBox)item.FindControl("txtCantidadHoras");
                txtCantidadHoras.Attributes.Add("onblur", "return sumarDistribucion();");
            }
        }
    }
}